package cn.iocoder.yudao.module.product.service.skustorerelation;

import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.product.controller.admin.skustorerelation.vo.SkuStoreRelationPageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.skustorerelation.vo.SkuStoreRelationRespVO;
import cn.iocoder.yudao.module.product.controller.admin.skustorerelation.vo.SkuStoreRelationSaveReqVO;
import cn.iocoder.yudao.module.product.controller.admin.skustorerelation.vo.SkuStoreRelationSaveVO;
import cn.iocoder.yudao.module.product.convert.skustorerelation.SkuStoreRelationConvert;
import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
import cn.iocoder.yudao.module.product.dal.dataobject.skustorerelation.SkuStoreRelationDO;
import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper;
import cn.iocoder.yudao.module.product.dal.mysql.skustorerelation.SkuStoreRelationMapper;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.google.common.collect.Lists;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_STORE_RELATION_NOT_EXISTS;

/**
 * sku与门店关系 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class SkuStoreRelationServiceImpl implements SkuStoreRelationService {

    @Resource
    private SkuStoreRelationMapper skuStoreRelationMapper;

    @Resource
    private ProductSkuMapper productSkuMapper;

    @Resource
    private DeptApi deptApi;

    @Override
    public void createOrUpdateSkuStoreRelation(List<SkuStoreRelationSaveReqVO> createReqVO) {
        // 插入和更新
        List<SkuStoreRelationDO> skuStoreRelation = BeanUtils.toBean(createReqVO, SkuStoreRelationDO.class);
        skuStoreRelationMapper.insertOrUpdateBatch(skuStoreRelation);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSkuStoreRelation(SkuStoreRelationSaveReqVO updateReqVO) {
        // 校验存在
        validateSkuStoreRelationExists(updateReqVO.getId());
        // 更新
        SkuStoreRelationDO updateObj = SkuStoreRelationConvert.INSTANCE.convertDO(updateReqVO);
        skuStoreRelationMapper.updateById(updateObj);
    }

    @Override
    public void deleteSkuStoreRelation(Long id) {
        // 校验存在
        validateSkuStoreRelationExists(id);
        // 删除
        skuStoreRelationMapper.deleteById(id);
    }

    private void validateSkuStoreRelationExists(Long id) {
        if (skuStoreRelationMapper.selectById(id) == null) {
            throw exception(SKU_STORE_RELATION_NOT_EXISTS);
        }
    }

    @Override
    public SkuStoreRelationDO getSkuStoreRelation(Long id) {
        return skuStoreRelationMapper.selectById(id);
    }

    @Override
    public PageResult<SkuStoreRelationPageReqVO> getSkuStoreRelationPage(SkuStoreRelationPageReqVO pageReqVO) {
        PageResult<SkuStoreRelationDO> page = skuStoreRelationMapper.selectPage(pageReqVO);
        PageResult<SkuStoreRelationPageReqVO> bean = BeanUtils.toBean(page, SkuStoreRelationPageReqVO.class);
        if (CollectionUtil.isNotEmpty(bean.getList())) {

            forEachSkuStoreList(BeanUtils.toBean(bean.getList(), SkuStoreRelationRespVO.class));
        }

        return bean;
    }


    // set对应属性值
    private void forEachSkuStoreList(List<SkuStoreRelationRespVO> list) {
        list.forEach( x -> {
            ProductSkuDO productSkuDO = productSkuMapper.selectById(x.getSkuId());
            x.setSkuName(productSkuDO.getName());

            x.setPickUpStoreName(deptApi.getDept(x.getPickUpStoreId()).getName());
            x.setPrice(productSkuDO.getPrice());
            // 上浮价格
            if (x.getType() == 0) {
                x.setPickUpStorePrice(productSkuDO.getPrice() + (x.getFluctuationPrice() == null ? 0 : x.getFluctuationPrice()));
            }
            // 下浮价格
            if (x.getType() == 1) {
                x.setPickUpStorePrice(productSkuDO.getPrice() - (x.getFluctuationPrice() == null ? 0 : x.getFluctuationPrice()));
            }
        });
    }

    @Override
    public void insertBatch(List<SkuStoreRelationSaveReqVO> skuStoreRelationSaveReqVO) {
        // 批量插入
        skuStoreRelationMapper.insertBatch(SkuStoreRelationConvert.INSTANCE.convertDOList(skuStoreRelationSaveReqVO));
    }


    @Override
    public void updateBatch(List<SkuStoreRelationSaveReqVO> skuStoreRelationSaveReqVO) {
        // 批量插入
        skuStoreRelationMapper.updateBatch(SkuStoreRelationConvert.INSTANCE.convertDOList(skuStoreRelationSaveReqVO));
    }


    @Override
    public List<SkuStoreRelationDO> getSkuStoreRelationBySkuId(Long skuId) {
        LambdaQueryWrapper<SkuStoreRelationDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(SkuStoreRelationDO::getSkuId,skuId);
        lambdaQueryWrapper.eq(SkuStoreRelationDO::getDeleted,false);
        return skuStoreRelationMapper.selectList(lambdaQueryWrapper);
    }

    @Override
    public List<SkuStoreRelationRespVO> getSkuStoreRelationList(SkuStoreRelationRespVO respVO) {
        List<SkuStoreRelationRespVO> list = BeanUtils.toBean(skuStoreRelationMapper.selectList(respVO), SkuStoreRelationRespVO.class);
        forEachSkuStoreList(list);
        return list;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createStoreSkuStoreRelation(SkuStoreRelationSaveVO skuStoreRelationSaveVO) {
        insertBatchSkuStoreRelation(skuStoreRelationSaveVO);
    }

    /**
     *  批量插入
     * @param: skuStoreRelationSaveVO
     * @return: void
     * @author xulimin
     * @date: 2023/12/28 10:28
     */
    private void insertBatchSkuStoreRelation(SkuStoreRelationSaveVO skuStoreRelationSaveVO) {
        List<SkuStoreRelationDO> skuStoreRelationSaveVOS = Lists.newArrayList();
        skuStoreRelationSaveVO.getPickUpStoreIdList().forEach(pickUpStoreId->{
            SkuStoreRelationDO skuStoreRelationDO = new SkuStoreRelationDO();
            skuStoreRelationDO.setSkuId(skuStoreRelationSaveVO.getSkuId());
            skuStoreRelationDO.setPickUpStoreId(pickUpStoreId);
            skuStoreRelationDO.setType(CommonStatusEnum.ENABLE.getStatus());
//            skuStoreRelationDO.setFluctuationPrice(BigDecimal.ZERO.intValue());
            skuStoreRelationSaveVOS.add(skuStoreRelationDO);
        });
        skuStoreRelationMapper.insertBatch(skuStoreRelationSaveVOS);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateStoreSkuStoreRelation(SkuStoreRelationSaveVO skuStoreRelationSaveVO) {
        //删除
        LambdaUpdateWrapper<SkuStoreRelationDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.eq(SkuStoreRelationDO::getSkuId,skuStoreRelationSaveVO.getSkuId());
        lambdaUpdateWrapper.set(SkuStoreRelationDO::getDeleted,true);
        skuStoreRelationMapper.update(lambdaUpdateWrapper);
        //新增
        insertBatchSkuStoreRelation(skuStoreRelationSaveVO);
    }

}